En este notebook hemos escrito distintos ejercicios para que el lector pueda entrenarse y mejorar sus habilidades con CUDA C.
En primer lugar pondremos una plantilla parecida a aquella que hemos escrito en los ejercicios anteriores para que el lector tenga una pequeña guía.
In [ ]:
%%writefile ejercicio.cu
// Escribir el kernel
__global__ Nombre_Kernel()
{
// Puedes declarar variables en GPU
// Escribir el codigo que seguira cada bloque o thread
}
int main( int argc, char * argv[])
{
// Declara las variables en el CPU
// Escribe abajo las lineas para la alocacion de memoria
// Escribe abajo las lineas para la copia de memoria del CPU al GPU
// Escribe las dimensiones de los bloques y mallas
// Escribe las lineas para lanzar el kernel
// Copia la memoria del GPU al CPU
// Libera la memoria
// Escribe un codigo para poder saber si tu resultado es correcto
return 0 ;
}
Para los siguiente ejercicios se recomienda usar la programación en bloques
. Es decir utilizar la memoria compartida
.
1. Sea un vector unidimensional $u$ con $30$ entradas divididas en 10 bloques y sea un vector de tres entradas $m \ = \ (1,2,3)$. Sumar a cada bloque de $u$ el vector $m$ con ayuda de la memoria constante
. Esto se hace declarando $m$ de la siguiente manera para luego usar la variable estática en el kernel
.
__constant__ int m[3] ;
La memoria constante
tiene la ventaja de hacer más eficiente el acceso a información que tendrá que ser usada durante todo el programa. Pero atención, para arreglos muy grandes la memoria constante viene a perder sus ventajas, por lo que se recomienda utilizar este tipo de memoria para información con tamaño menor o igual a 32B.
2. Sea una matriz de $10 \times 10$. Para cada una de las entradas calcula el promedio de ella y las cuatro entradas a su alrededor (arriba, abajo y a los lados) para luego colocarla en una nueva matriz de $10 \times 10$.
Haz el ejercicio para fronteras abiertas y cerradas.
3. Sea una matriz de $10 \times 15 \times 8 $. Idea una indexación para mapear el índice en tres dimensions $x,y,z$ a uno en una dimensión.
4. Sea un vector unidimensional con 1000 entradas. A cada entrada súmale 3 unidades y luego eleva al cuadrado el resultado. El vector tiene que estar dividido en bloques de 16.
En cada uno de los bloques suma todas las entradas que se encuentren en este para obtener un vector de 16 entradas. Repite el procedimiento (suma, elevación al cuadrado) para luego sumar las entradas en 8 bloques, luego en 4 bloques, 2 bloques para luego finalmente obtener la suma de los resultados en los dos bloques.
Recuerda que cualquier duda, comentario o queja puedes escribirnos a:
In [ ]: